﻿using Npgsql;
using Ortodoctor.Componentes;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;

namespace Ortodoctor.modelo
{
    public class modeloAgendamento : conexao
    {
        public modeloAgendamento()
        {
            conn = new NpgsqlConnection(connectionstring);
            conn.Open();
        }

        public int insert(Agendamento a)
        {
            int id;
            try
            {
                //con.open();
                String sql = @"INSERT INTO agenda(
                                data, 
                                id_cliente, 
                                id_funcionario, 
                                horario, 
                                termino,
                                compareceu,
                                cancelado) 
                               VALUES (
                         :p1,:p2,:p3,:p4,:p5,:p6,:p7) returning id_agenda";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", a.Data);
                com.Parameters.AddWithValue("p2", a.IdCliente);
                com.Parameters.AddWithValue("p3", a.IdFuncionario);
                com.Parameters.AddWithValue("p4", a.Horario);
                com.Parameters.AddWithValue("p5", a.Termino);
                com.Parameters.AddWithValue("p6", a.Compareceu);
                com.Parameters.AddWithValue("p7", a.Cancelado);
                id = (int.Parse(com.ExecuteScalar().ToString()));
            }
            finally
            {
                conn.Close();
            }
            return id;
        }

        public DataTable getAll()
        {
            DataTable dt = new DataTable();
            DateTime dataHoje = DateTime.Today;

            try
            {
                String sql = "SELECT a.*, c.nome as nome_cliente, ci.id_clinica, f.nome as nome_funcionario FROM agenda a " +
                    "INNER JOIN cliente c using(id_cliente) INNER JOIN clinica ci using (id_clinica) INNER JOIN funcionario f using (id_funcionario)" +
                    " WHERE data between '" + dataHoje.AddDays(-7).ToString("yyyy/MM/dd") + "' and '" + dataHoje.AddDays(7).ToString("yyyy/MM/dd")+"'";

                var a = sql;

                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getAgenda(DateTime data)
        {
            DataTable dt = new DataTable();
            try
            {
                String sql = "SELECT a.*, c.nome as nome_cliente, ci.id_clinica, f.nome as nome_funcionario FROM agenda a "+
                             "INNER JOIN cliente c using(id_cliente) INNER JOIN clinica ci using (id_clinica) INNER JOIN funcionario f using (id_funcionario)"+
                                " WHERE a.data = :p0";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p0", data);

                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getAgendaPorId(long id)
        {
            DataTable dt = new DataTable();
            try
            {
                String sql = "SELECT a.*, c.nome as nome_cliente, ci.id_clinica, f.nome as nome_funcionario FROM agenda a " +
                             "INNER JOIN cliente c using(id_cliente) INNER JOIN clinica ci using (id_clinica) INNER JOIN funcionario f using (id_funcionario)" +
                                " WHERE a.id_agenda = :p0";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p0", id);

                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public void editarAgenda(long id, Agendamento agendamento, int idUsuario)
        {
            try
            {
                String sql = "UPDATE agenda SET id_cliente=:p0, id_funcionario=:p1, horario=:p2, termino=:p3, "+
                "id_usuario_modificacao=:p4, compareceu=:p5 WHERE id_agenda = :p6";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p0", agendamento.IdCliente);
                com.Parameters.AddWithValue("p1", agendamento.IdFuncionario);
                com.Parameters.AddWithValue("p2", agendamento.Horario);
                com.Parameters.AddWithValue("p3", agendamento.Termino);
                com.Parameters.AddWithValue("p4", idUsuario);
                com.Parameters.AddWithValue("p5", agendamento.Compareceu);
                com.Parameters.AddWithValue("p6", agendamento.Id_agenda);

                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        public DataTable getAgendaDia()
        {
            DataTable dt = new DataTable();
            try
            {
                String sql = "SELECT a.*, c.nome, ci.id_clinica FROM agenda a INNER JOIN cliente c using(id_cliente) INNER JOIN clinica ci using (id_clinica)" +
                                " WHERE a.data = :p0";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p0", DateTime.Today);

                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public void removerComparecimento(long id_agenda)
        {
            try
            {
                String sql = "DELETE FROM comparecimento WHERE id_agenda=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id_agenda);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }
    }
}